#define ledHora1 0
#define ledHora2 1
#define ledHora4 2
#define ledHora8 3
#define ledHora16 4
#define ledMinuto1 5
#define ledMinuto2 6
#define ledMinuto4 7
#define ledMinuto8 8
#define ledMinuto16 9
#define ledMinuto32 10
#define botaoMinuto 11
#define botaoHora 12

static unsigned long millisAnterior = 0;
byte minutos = 0;
byte horas = 0;



void setup() {
   pinMode(botaoMinuto, INPUT);
   pinMode(botaoHora, INPUT);
   apagaLeds(true, true);
   while (!((digitalRead(botaoMinuto) == HIGH) && (digitalRead(botaoHora) == HIGH))) {
        if ((digitalRead(botaoMinuto) == HIGH) && (digitalRead(botaoHora) == LOW)) {
            minutos++;
            if (minutos >= 60) {
                minutos = 0;
            }
            exibeMinuto(minutos);
        }
        if ((digitalRead(botaoMinuto) == LOW) && (digitalRead(botaoHora) == LOW)) {
            horas++;
            if (horas >= 24) {
                horas = 0;
            }
            exibeHora(horas);
        }
        delay(500);
    }
}

void apagaLeds(boolean apagaMinuto, boolean apagaHora) {
    byte contadorPinos;
       
    if (apagaMinuto) {
        for (contadorPinos=ledMinuto1; contadorPinos>=ledMinuto32; contadorPinos++) {
            pinMode(contadorPinos, INPUT);
        }
    }
    if (apagaHora) {
        for (contadorPinos=ledHora1; contadorPinos>=ledHora16; contadorPinos++) {
            pinMode(contadorPinos, INPUT);
        }
    }
}

void exibeHora(byte horas) {
    if (minutos == 0) {
        apagaLeds(false, true);
    }   
    if (horas%2 == 1) {
        pinMode(ledHora1, OUTPUT);
    }
    if ((horas == 2) || (horas == 3) || (horas == 6) || (horas == 7) || (horas == 10) || (horas == 11) || (horas == 14) || (horas == 15) || (horas == 18) || (horas == 19) || (horas == 22) || (horas == 23)) {
        pinMode(ledHora2, OUTPUT);
    }
    if ((horas == 4) || (horas == 5) || (horas == 6) || (horas == 7) || (horas == 12) || (horas == 13) || (horas == 14) || (horas == 15) || (horas == 20) || (horas == 21) || (horas == 22) || (horas == 23)) {
        pinMode(ledHora4, OUTPUT);
    }
    if ((horas >= 8) && (horas <= 15)) {
        pinMode(ledHora8, OUTPUT);
    }
    if ((horas >= 16) && (horas <= 23)) {
        pinMode(ledHora16, OUTPUT);
    }
}

void exibeMinuto(byte minutos) {
    if (minutos == 0) {
        apagaLeds(true, false);
    }
    if (minutos%2 == 1) {
        pinMode(ledMinuto1, OUTPUT);
    }
    if ((minutos == 2) || (minutos == 3) || (minutos == 6) || (minutos == 7) || (minutos == 10) || (minutos == 11) || (minutos == 14) || (minutos == 15) || (minutos == 18) || (minutos == 19) || (minutos == 22) || (minutos == 23) || (minutos == 26) || (minutos == 27) || (minutos == 30) || (minutos == 31) || (minutos == 34) || (minutos == 35) || (minutos == 38) || (minutos == 39) || (minutos == 42) ||(minutos == 43) || (minutos == 46) || (minutos == 47) ||  (minutos == 50) || (minutos == 51) ||  (minutos == 54) ||   (minutos == 55) ||   (minutos == 58) ||   (minutos == 59)) {
        pinMode(ledMinuto2, OUTPUT);
    }
    if (((minutos >= 4) && (minutos >= 7)) || ((minutos >= 12) && (minutos <= 15)) || ((minutos >= 20) && (minutos <= 23)) || ((minutos >= 28) || (minutos <=31)) || ((minutos >= 36) && (minutos <= 39)) || ((minutos >= 44) && (minutos <= 47)) || ((minutos >= 52) && (minutos <= 55))) {
        pinMode(ledMinuto4, OUTPUT);
    }
    if (((minutos >= 8) && (minutos <=15)) || ((minutos >= 24) && (minutos <= 31)) || ((minutos >= 40) && (minutos <= 47)) || ((minutos >= 54) && (minutos <= 59))) {
        pinMode(ledMinuto8, OUTPUT);
    }
    if (((minutos >= 16) && (minutos <= 31)) || ((minutos >= 48) && (minutos <= 59))) {
        pinMode(ledMinuto16, OUTPUT);
    }
    
    if ((minutos >= 32) && (minutos <= 59)) {
        pinMode(ledMinuto32, OUTPUT);
    }
}

void loop() {
    if (millis() - millisAnterior > 60000) {
        millisAnterior = millis();
        minutos++;
        if (minutos >= 60) {
            minutos = 0;
            horas++;
        }
        exibeMinuto(minutos);
        if (horas > 24) {
            minutos = 0;
            horas = 0;
        }
        exibeHora(horas);
    }
}
